Due to ever increasing video resolutions, and rising expectations for high quality video images, a high demand exists for efficient image data compression of video while performance is limited for coding with existing video coding standards such as H.264, Advanced video coding (AVC), or H.265/HEVC (High Efficiency Video Coding), and other video coding standards. The aforementioned standards use expanded forms of traditional approaches to address the insufficient compression/quality problem, but often the results are still insufficient and require a large amount of energy to compute the results.
The conventional video coding processes use inter-prediction at an encoder to reduce temporal (frame-to-frame) redundancy. This is accomplished by first performing motion estimation to determine where the same or similar image data has moved between a reference frame and a current frame being analyzed. The frames are often partitioned into blocks, and the motion is represented by a motion vector that indicates where a block has moved from frame-to-frame. Motion compensation is then performed to apply the motion vector to construct a prediction block for a current frame to be reconstructed. A prediction mode selector then compares candidate predictions including those from the inter-prediction and other techniques such as intra-prediction to determine a best prediction mode for a block. For the selected best prediction mode, the difference in image data of a block between the prediction and real (original or actual) data is called the residual data and is compressed and encoded together with the motion vector when inter-prediction is selected as the best prediction mode.
Motion estimation often includes a search on a reference frame for one or more blocks that match a block being analyzed on the current frame. The searching is very computationally intensive when a large number of pixels over a wide area of a screen or frame require such searching. In order to limit brute searches, a motion vector previously determined on one or more spatial neighbor blocks may be used to determine a motion vector on a current block on the same frame. Since a block is relatively small compared to the size of a screen, however, from 64×64 bits to 4×4 bits depending on the standard, this still is very computationally heavy. Thus, these motion vector determining techniques consume a large amount of memory bandwidth and power, especially when large areas of a frame require such motion estimation techniques.